const jwt = require('jsonwebtoken'); // 导入JWT库，用于处理令牌验证

/**
 * 检查用户是否已认证
 * 这是一个辅助中间件，不直接使用
 */
const isAuthenticated = (req, res, next) => {
  if (!req.user) {
    return res.status(401).json({ message: '需要登录认证' });
  }
  next();
};

/**
 * 检查用户是否是管理员
 * 这是一个辅助中间件，不直接使用
 */
const isAdmin = (req, res, next) => {
  if (!req.user.is_admin) {
    return res.status(403).json({ message: '需要管理员权限' });
  }
  next();
};

/**
 * 认证中间件
 * 用于验证用户是否已登录，通过验证请求头中的JWT令牌
 */
const authMiddleware = (req, res, next) => {
  // 尝试从不同的请求头中获取令牌
  const tokenHeader = req.header('x-auth-token');
  const authHeader = req.header('Authorization');
  
  // 从Authorization头中提取令牌（如果存在）
  let bearerToken = null;
  if (authHeader && authHeader.startsWith('Bearer ')) {
    bearerToken = authHeader.substring(7);
  }
  
  // 使用第一个可用的令牌
  const token = tokenHeader || bearerToken;
  
  // 检查是否有令牌
  if (!token) {
    return res.status(401).json({ message: '没有提供令牌，拒绝访问' });
  }

  // 验证令牌
  try {
    // 解码令牌并验证有效性
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    // 将解码后的用户信息添加到请求对象中
    req.user = decoded.user;
    next(); // 继续下一步处理
  } catch (err) {
    // 根据错误类型返回不同的错误消息
    if (err.name === 'TokenExpiredError') {
      return res.status(401).json({ message: '令牌已过期，请重新登录' });
    } else if (err.name === 'JsonWebTokenError') {
      return res.status(401).json({ message: '无效的令牌格式' });
    } else {
      return res.status(401).json({ message: '令牌无效' });
    }
  }
};

/**
 * 管理员权限中间件
 * 用于验证用户是否具有管理员权限
 * 必须在authMiddleware之后使用
 */
const adminMiddleware = (req, res, next) => {
  if (!req.user.is_admin) {
    return res.status(403).json({ message: '拒绝访问。需要管理员权限' });
  }
  next();
};

// 导出中间件函数
module.exports = {
  isAdmin,
  isAuthenticated,
  authMiddleware,
  adminMiddleware
}; 